home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / MacPerl 506 appl folder.sit / MacPerl 506 appl folder / Mac_Perl_506r1m_appl / lib / IPC / Open2.pm next >
Text File  |  1995-03-20  |  2KB  |  65 lines

  1. die "Open2.pm not (yet) implemented on the Mac";
  2.  
  3. package IPC::Open2;
  4. require 5.000;
  5. require Exporter;
  6. use Carp;
  7.  
  8. @ISA = qw(Exporter);
  9. @EXPORT = qw(open2);
  10.  
  11. # &open2: tom christiansen, <tchrist@convex.com>
  12. #
  13. # usage: $pid = open2('rdr', 'wtr', 'some cmd and args');
  14. #    or  $pid = open2('rdr', 'wtr', 'some', 'cmd', 'and', 'args');
  15. #
  16. # spawn the given $cmd and connect $rdr for
  17. # reading and $wtr for writing.  return pid
  18. # of child, or 0 on failure.  
  19. # WARNING: this is dangerous, as you may block forever
  20. # unless you are very careful.  
  21. # $wtr is left unbuffered.
  22. # abort program if
  23. #    rdr or wtr are null
  24. #     pipe or fork or exec fails
  25.  
  26. $fh = 'FHOPEN000';  # package static in case called more than once
  27.  
  28. sub open2 {
  29.     local($kidpid);
  30.     local($dad_rdr, $dad_wtr, @cmd) = @_;
  31.  
  32.     $dad_rdr ne ''         || croak "open2: rdr should not be null";
  33.     $dad_wtr ne ''         || croak "open2: wtr should not be null";
  34.  
  35.     # force unqualified filehandles into callers' package
  36.     local($package) = caller;
  37.     $dad_rdr =~ s/^[^']+$/$package'$&/;
  38.     $dad_wtr =~ s/^[^']+$/$package'$&/;
  39.  
  40.     local($kid_rdr) = ++$fh;
  41.     local($kid_wtr) = ++$fh;
  42.  
  43.     pipe($dad_rdr, $kid_wtr)     || croak "open2: pipe 1 failed: $!";
  44.     pipe($kid_rdr, $dad_wtr)     || croak "open2: pipe 2 failed: $!";
  45.  
  46.     if (($kidpid = fork) < 0) {
  47.     croak "open2: fork failed: $!";
  48.     } elsif ($kidpid == 0) {
  49.     close $dad_rdr; close $dad_wtr;
  50.     open(STDIN,  "<&$kid_rdr");
  51.     open(STDOUT, ">&$kid_wtr");
  52.     warn "execing @cmd¥n" if $debug;
  53.     exec @cmd;
  54.     croak "open2: exec of @cmd failed";   
  55.     } 
  56.     close $kid_rdr; close $kid_wtr;
  57.     select((select($dad_wtr), $| = 1)[0]); # unbuffer pipe
  58.     $kidpid;
  59. }
  60. 1; # so require is happy
  61.  
  62.